
package testy;

import java.awt.Point;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.XMLConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import resources.XMLworker;
import cii_tb6s.CII_TB6S_KX1_cfg_tab;
import cii_tb6s.CTB6S_KX1;
import cii_functions.FCII_IDENTIFICATOR;
import cii_functions.FCII_IDENTIFICATOR;
import cii_functions.FCII_TIMER;
import cii_kx1_bpf3.CII_KX1_BPF3_cfg_tab;
import cii_kx1_bpf3.CKX1_BPF3;
import cii_kx1_fmc3.CKX1_FMC3;
import cii_lib.CCII_ACCESS_INTERF;
import cii_lib.CCII_COMPONENT;
import cii_lib.CCII_TABLE_INDEX;
import cii_lib_graph.GCII_DPM_DAQ;
import cii_lib_graph.GCII_IDENTYFICATOR;
import cii_lib_graph.GCII_TIMER;
import cii_lib_graph.GCII_TRANSCEIVER;
import cii_lib_graph.GComponentManager;
import cii_lib_graph.GInterfaceTerminal;
import cii_lib_graph.GInterfacesPanel;
import cii_opto.CCII_MUX_DATA_TRANSCEIVER;
import cii_opto.CCII_TIMER;
import cii_opto.CII_OPTO_cfg_tab;
import componentEnhancement.ArrayTaker;
import componentEnhancement.ContextUtils;

public class TestEngine {
	
	private static final Logger log = LoggerFactory.getLogger(TestEngine.class);
	public static void main(String[] args) {
//		try {
//			UIManager.setLookAndFeel(new SubstanceRavenGraphiteGlassLookAndFeel());
//		} catch (UnsupportedLookAndFeelException e) {
//			// TODO Auto-generated catch block
//			log.error("", e);
//		}

		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				test();
			} 
		});
		
	} 
	public static void test() {
		 
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {
			log.error("", e);
		} catch (InstantiationException e) { 
			log.error("", e);
		} catch (IllegalAccessException e) {
			log.error("", e);	
		} catch (UnsupportedLookAndFeelException e) {
			log.error("", e);
		}
		 
		ArrayTaker a = new ArrayTaker();
		a.getTableSize(); 
		int index=0;
		for(int i=0;i<a.getComponentHeaders().size();i++) {
			String name = a.getComponentHeaders().get(i).Name;
			log.debug(name);
			if (name!=null && name.equals("COMP_ID")) index = 51; 
			name = null;
		}
		CCII_TABLE_INDEX tm = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),index);
//		CCII_TABLE_INDEX dlaGlob = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),0);
//		CCII_TABLE_INDEX ti = new CCII_TABLE_INDEX(tm,index);
		TestHardware th = new TestHardware();

		CCII_MUX_DATA_TRANSCEIVER glob = new CCII_MUX_DATA_TRANSCEIVER(CII_OPTO_cfg_tab.ITAB,0,th,null);
	
		//Second table:
		//CTB6S_KX1 g2 = new CTB6S_KX1(cii_tb6s.CII_TB6S_KX1_cfg_tab.ITAB,0,th,null);
//		CKX1_FMC3 g2 = new CKX1_FMC3(cii_kx1_fmc3.CII_KX1_FMC3_cfg_tab.ITAB, 0, th, null);
		CKX1_BPF3 g2 = new CKX1_BPF3(cii_kx1_bpf3.CII_KX1_BPF3_cfg_tab.ITAB, 0, th, null);
		//INFO : Store to file TMP
//		try {
//		FileOutputStream f = new FileOutputStream("_TMPGLOB"); 
//        ObjectOutputStream s = new ObjectOutputStream(f); 
//        s.writeObject(glob); 
//        s.flush(); 
//		} catch (Exception e) {
//			log.debug(e.getLocalizedMessage());
//		}
		
		FCII_IDENTIFICATOR cid ;
//		cid = new FCII_IDENTIFICATOR(glob.COMP_ID(0).CII_IDENTIFICATOR());
		CCII_COMPONENT comm= g2.COMP_ID(0).CII_IDENTIFICATOR();
		cid = new FCII_IDENTIFICATOR(comm);
//		cid.tes
		log.debug("path " + cid.getComponent().PathName());
		System.out.println("path " + cid.getComponent().PathName());
		
		tm = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),index);
		
//		cid = new FCII_IDENTIFICATOR(tm,1,th,null);
		GCII_IDENTYFICATOR giden = new GCII_IDENTYFICATOR(cid);
//		giden.test();
		
		tm = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),index);
//		
//		FCII_IDENTIFICATOR fcid = new FCII_IDENTIFICATOR(tm, 1,th,null);
//		log.debug("testCreator "+fcid.testCreator(null, null));
		GInterfaceTerminal atm = new GInterfaceTerminal(glob.BITS_TEST());
//		GInterfaceTerminal.test(atm);
		
//		log.debug("rB: "+cid.WORD_USER().Read().GetBin());
		
		
		// ACCESS PANEL
//		JFrame frame = new JFrame();
//		GAccessPanel jp = new GAccessPanel(); 
////		jp.getDiodes().getElements().nextElement().setSelected(true);
//		frame.getContentPane().add(jp);
//		frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		//frame.setLayout(null);
//		frame.pack();
//		frame.getContentPane().setLayout(null);
//		frame.setPreferredSize(new Dimension(600,400));
//		frame.setVisible(true);
		
//		JFrame frame2 = new JFrame("p");
//		frame2.setLocation((int)(Math.random()*1100), (int)(Math.random()*854));
//		cid.initPanel();
//		JPanel pcid = cid.getDefaultPanel();
//		frame2.getContentPane().add(pcid);
//		frame2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		//frame2.setLayout(null);
//		frame2.getContentPane().setLayout(null);
//		frame2.setPreferredSize(new Dimension(pcid.getWidth()+10,pcid.getHeight()+30));
//		frame2.pack();
//		frame2.setVisible(true);
//	
		
//		PluginFinder pl = new PluginFinder();
//		try {
//			Class aa = pl.getClass(new File("D:\\PRACE\\workspace\\CII_1edit\\cii_lib\\CII_OPTO_cfg_tab.class"),
//					"CII_OPTO_cfg_tab");
//			log.debug("\t\t"+aa.getName());
//			CII_OPTO_cfg_tab tab = (CII_OPTO_cfg_tab)aa.newInstance();
//			log.debug("instanced "+CII_OPTO_cfg_tab.ITAB.getTableSize());
//		} catch (Exception e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
		JFrame frame2 = new JFrame("p");
		frame2.setLocation((int)(Math.random()*1100), (int)(Math.random()*854));
		GComponentManager testbetter = new GComponentManager(glob.COMP_TIMER(0).CII_TIMER());
		testbetter.getDefaultPanel().setVisible(true);
		Class<?> name;
		File clasfile = new File("D:\\PRACE\\workspace\\cii_test\\");
		
//		GComponentManager gc= new GComponentManager();
//		try {
//			URL url = clasfile.toURL();
//			URL[] urls = new URL[]{url};
//			
////			name = ClassLoader.getSystemClassLoader().loadClass("cii_lib_graph.GComponentManager");
//			java.lang.ClassLoader cl = new URLClassLoader(urls);
////			cl = ClassLoader.getSystemClassLoader();
//			name = cl.loadClass("cii_lib_graph.GComponentManager");
//			gc = (GComponentManager)name.newInstance();
//			gc.setComp(glob.COMP_TIMER(0).CII_TIMER());
//		} catch (Exception e) {
//			log.error("", e);
//		}
//		JPanel pcid = gc.getDefaultPanel();
//		frame2.getContentPane().add(pcid);
//		frame2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		//frame2.setLayout(null);
//		frame2.getContentPane().setLayout(null);
//		frame2.setPreferredSize(new Dimension(pcid.getWidth()+10,pcid.getHeight()+30));
//		frame2.pack();
//		frame2.setVisible(true);
		
//		CCII_TABLE_INDEX tmSend = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),105);
//		CCII_PART_DATA_SENDER send = new CCII_PART_DATA_SENDER(tmSend,4,th,null);
//		log.debug(send.IPAR_PART_NUM().Get());
//		JFrame frame3 = new JFrame();
//		frame3.setLocation((int)(Math.random()*1100), (int)(Math.random()*854));
//		send.initPanel();
//		JPanel pcs = send.getDefaultPanel();
//		frame3.getContentPane().add(pcs);
//		frame3.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		frame3.getContentPane().setLayout(null);
//		frame3.setPreferredSize(new Dimension(pcs.getWidth()+10,pcs.getHeight()+30));
//		frame3.pack();
//		frame3.setVisible(true);
//		
//		JFrame frame4 = new JFrame("frame4");
//		frame4.setLocation((int)(Math.random()*1100), (int)(Math.random()*854));
//		GInterfaceTablePanel gitpp = new GInterfaceTablePanel();
//		JPanel cps = gitpp.getPanel();
//		cps.setBounds(0, 0, cps.getWidth(), cps.getHeight());
//		frame4.getContentPane().add(cps);
//		gitpp.DisplayInterface(glob.BITS_TEST());
//		frame4.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		frame4.getContentPane().setLayout(null);
//		frame4.setPreferredSize(new Dimension(cps.getWidth()+10,cps.getHeight()+30));
//		frame4.pack();
//		frame4.setVisible(true);
		
//		CCII_TABLE_INDEX tmarea = new CCII_TABLE_INDEX(CII_OPTO_cfg_tab.ITAB.getItems(),310);
//		CCII_ACCESS_RW area = new CCII_ACCESS_RW(tmarea,th,cid.CII_IDENTIFICATOR());
//		JFrame frame5 = new JFrame();
//		frame5.setLocation((int)(Math.random()*1100), (int)(Math.random()*854));
//		GInterfaceTablePanel gitp2 = new GInterfaceTablePanel();
//		JPanel cps2 = gitp2.getPanel();
//		cps.setBounds(0, 0, cps2.getWidth(), cps2.getHeight());
//		frame5.getContentPane().add(cps);
//		gitp.DisplayInterface(area);
//		frame5.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		frame5.getContentPane().setLayout(null);
//		frame5.setPreferredSize(new Dimension(cps2.getWidth()+10,cps2.getHeight()+30));
//		frame5.pack();
//		frame5.setVisible(true);
//		
//		log.debug("test");
//		((FCII_IDENTIFICATOR)cid).writeRndSamples(10);

		
//		JFrame frame6 = new JFrame("x");
//		GInterfacesPanel gitp = new GInterfacesPanel(atm);
//		gitp.getTerminalsScrollPane().setBounds(0, 0, 385, 70);
//		gitp.setPreferredSize(new java.awt.Dimension(379, 40));
//		frame6.getContentPane().add(gitp);
//		frame6.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//		frame6.pack();
//		frame6.setVisible(true);
		
//		log.debug("adr z g: "+atm.getTerminalsVector().get(1).actionRead());		
		
		log.debug(glob.COMP_TIMER(0).COMP_DELAY(0).COMP_DEL_REG(0)._CII_REG_DEL.Name());
//		gcb.getValueTxt().setVisible(false);		
		String [] ele = {"namelabel","address","towritefiled","toreadbutton","towritebutton","toreadwritebutton","toreadfield"};
		String xml = XMLworker.createConfigXMLModel("GInterfaceterminal",ele);
		XMLworker.parseXMLtoElements(xml);
		atm.changeLayout(xml);
		
		CCII_TIMER timer = glob.COMP_TIMER(0);
//		GInterfaceTerminal gtim = new GInterfaceTerminal(timer.BITS_CLK_ENA());		
		FCII_TIMER ftimer = new FCII_TIMER(timer);
		GCII_TIMER gtimer = new GCII_TIMER(ftimer);

		
		ResizableComponent rc = new ResizableComponent(gtimer.getTimerPanel(),new Point(806,7));
		rc.setIconImage(Toolkit.getDefaultToolkit().createImage("D:\\Folder-Desktop-16x16.png"));
		JPanel jpg = new JPanel();
		rc.addResizable(jpg =giden.getDefaultPane(),new Point(812,353));
		GCII_DPM_DAQ daqu = new GCII_DPM_DAQ(glob.COMP_DAQ(0).CII_DPM_DAQ());
//		daqu.loadComponent(glob.COMP_DAQ(0).CII_DPM_DAQ());
		rc.addResizable(daqu.getDefaultPane(), new Point(14,449));
		GCII_TRANSCEIVER transc = new GCII_TRANSCEIVER(glob.COMP_TX(0)._CII_MUX_DATA_SENDER,
				glob._CII_MUX_DATA_TRANSCEIVER);
		rc.addResizable(transc.getDefaultPanel(), new Point(14,9));
//		rc.addResizable(pane);
		
		// NEW TEST
//		CKX1_BPF3 backplane = new CKX1_BPF3(CII_KX1_BPF3_cfg_tab.ITAB,0,th,null);
//		GInterfaceTerminal gtt = new GInterfaceTerminal(backplane.BITS_COMM_RESET_ENA());
//		GInterfacesPanel gtp = new GInterfacesPanel(gtt);
//		gtp.getTerminalsScrollPane().setBounds(0, 0, 554, 62);
//		gtp.setBounds(63, 35, 554, 42);
//		rc.addResizable(gtp);
//		gtt.setVisible(true);
		
		
	      rc.setVisible(true);
//	    GInterfaceTerminal rtest = new GInterfaceTerminal(glob.COMP_DAQ(0).CII_DPM_DAQ().getChildren().get(0).getChildren().get(0).getInterfaces().get(3));
//		log.debug(rtest.getInterface().Name());
//		FCII_interfaceReader red1 = new FCII_interfaceReader(rtest,500);
//		new Thread(red1).start();
	    
//		gtimer.testGUI();
		Vector<CCII_COMPONENT> cc = glob.COMP_DAQ(0).CII_DPM_DAQ().getChildren();
		Iterator<CCII_COMPONENT> iter = cc.iterator();
//		while (iter.hasNext()) {
//			CCII_COMPONENT cmf = iter.next();
//			log.debug(cmf.Name());
//			GComponentManager gcomp = new GComponentManager();
//			gcomp.setComp(glob.COMP_MCLK(0)._CII_CLOCK_MULTIPL);
//			JPanel az = new JPanel();
//			az =gcomp.getDefaultPanel();
//			frame2.getContentPane().add(az);
//			frame2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//			frame2.setLayout(null);
//			frame2.getContentPane().setLayout(null);
//			frame2.setPreferredSize(new Dimension(az.getWidth()+10,az.getHeight()+30));
//			frame2.pack();
//			frame2.setVisible(true);
//		}
//		testFrame1 tf = new testFrame1();
//		JPanel az = tf.getDefPane();
//		DefaultMutableTreeNode aa = new DefaultMutableTreeNode();
//		aa= UltimateOPS.buildTreeModel(glob.CII_MUX_DATA_TRANSCEIVER());
//		tre.setModel(aa);
//		TestHardware.incrementType=-1;
//		GCII_TRANSCEIVER transc = new GCII_TRANSCEIVER(glob.COMP_TX(0)._CII_MUX_DATA_SENDER,
//				glob._CII_MUX_DATA_TRANSCEIVER);
//		rc.addResizable(transc.getDefaultPanel(), new Point(14,9));
//		frame2.getContentPane().add(transc.getDefaultPanel());
//		frame2.setSize(frame2.getContentPane().getPreferredSize());
//		frame2.setVisible(true);
//		JTree testree = new JTree(aa);
//		testree.setCellRenderer(UltimateOPS.treeRenderer());
//		TreeShow ts = new TreeShow(testree);
//		ts.setLocationRelativeTo(null);
//		ts.setVisible(true);
		
		//TEST Z JINTERNALFRAME
//		JPanel[] arr = {transc.getDefaultPanel(),daqu.getDefaultPane()};
//		TestWorkBench inst = new TestWorkBench(arr);
//		inst.setLocationRelativeTo(null);
//		inst.setVisible(true);	

//CONFIGUURACJA		
//		try {
//			XMLConfiguration cfg = new XMLConfiguration();
//			cfg.setValidating(true);
//			cfg.setRootElementName("systemConfiguration");
//			cfg.addProperty(glob._CII_MUX_DATA_TRANSCEIVER.GetItem().ParStrVal,glob._CII_MUX_DATA_TRANSCEIVER.Name()+"/component.xml");
//			XMLConfiguration intr= new XMLConfiguration(new File("ciiconfig/"+glob._CII_MUX_DATA_TRANSCEIVER.Name()+"/component.xml"));
//			intr.setRootElementName("interfaces");
//			intr.setProperty("name", glob._CII_MUX_DATA_TRANSCEIVER.Name());
//			for (CCII_ACCESS_INTERF it : glob._CII_MUX_DATA_TRANSCEIVER.getInterfaces()) {
//			intr.addProperty(it.Name()+"[@width]", it.Width());
//			intr.addProperty(it.Name()+"[@address]", it.GetItem().Address);
//			}
//			intr.save();
//			itearteComps(glob._CII_MUX_DATA_TRANSCEIVER,cfg);
//			cfg.save(new File("ciiconfig/system.xml"));
//		} catch (FileNotFoundException e) {
//			log.error("", e);
//		} catch (IOException e) {
//			log.error("", e);
//		} catch (Exception e) {
//			log.error("", e);
//		}
		log.debug(glob._CII_MUX_DATA_TRANSCEIVER.PathName());
		XMLConfiguration x =ContextUtils.getConfigFromPathName(glob.COMP_RX(0).COMP_DEMUX(0).BITS_CLK_INV());
//		GParameterPanel gpan = new GParameterPanel();
//		gpan.testGUI();
		
//
//		JFrame framex = new NewJFramett();
//		DataGenerator ngg = new DataGenerator(1000,(NewJFramett)framex,glob.BITS_TEST(),"test");
//		framex.setVisible(true);
//		TestHardware.incrementType = 2;
//		ngg.start("test");
		
	}
	
	public static void itearteComps(CCII_COMPONENT comp, Configuration cf) throws Exception {
		
		for (CCII_COMPONENT c : comp.getChildren()) {
			cf.addProperty(c.Name(),c.Name()+"/component.xml");
			XMLConfiguration intr= new XMLConfiguration(new File("ciiconfig/"+c.Name()+"/component.xml"));
			intr.setRootElementName("interfaces");
			intr.setProperty("name", c.Name());
			for (CCII_ACCESS_INTERF it : c.getInterfaces()) {
			intr.addProperty(it.Name()+"[@width]", it.Width());
			intr.addProperty(it.Name()+"[@address]", it.GetItem().Address);
			}
			intr.save();
				if (c.getChildren().size()>0) itearteComps(c,cf);
		}
	}

}
